/*
 *	Copyright (C) 2009,2015 by Jonathan Naylor, G4KLX
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; version 2 of the License.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 */

#include "DStarGMSKModulator.h"

#include "DStarDefines.h"

// Generated by gaussfir(0.5, 4, 10)
const wxFloat32 COEFFS_TABLE[] = {
	0.000000000000003F, 0.000000000000065F, 0.000000000001037F, 0.000000000014448F, 0.000000000174579F,
	0.000000001829471F, 0.000000016627294F, 0.000000131062698F, 0.000000895979719F, 0.000005312253663F, 0.000027316243802F,
	0.000121821714020F, 0.000471183399421F, 0.001580581180127F, 0.004598383433830F, 0.011602594308899F, 0.025390226926262F,
	0.048188078330624F, 0.079318443411643F, 0.113232294527059F, 0.140193533802410F, 0.150538369557851F, 0.140193533802410F,
	0.113232294527059F, 0.079318443411643F, 0.048188078330623F, 0.025390226926262F, 0.011602594308899F, 0.004598383433830F,
	0.001580581180127F, 0.000471183399421F, 0.000121821714020F, 0.000027316243802F, 0.000005312253663F, 0.000000895979719F,
	0.000000131062698F, 0.000000016627294F, 0.000000001829471F, 0.000000000174579F, 0.000000000014448F, 0.000000000001037F,
	0.000000000000065F, 0.000000000000003F};

const unsigned int COEFFS_LENGTH = 43U;

CDStarGMSKModulator::CDStarGMSKModulator() :
m_filter(COEFFS_TABLE, COEFFS_LENGTH),
m_invert(false)
{
}

CDStarGMSKModulator::~CDStarGMSKModulator()
{
}

unsigned int CDStarGMSKModulator::code(bool bit, wxFloat32* buffer, unsigned int length)
{
	wxASSERT(buffer != NULL);
	wxASSERT(length == DSTAR_RADIO_BIT_LENGTH);

	if (m_invert)
		bit = !bit;

	for (unsigned int i = 0U; i < DSTAR_RADIO_BIT_LENGTH; i++) {
		if (bit)
			buffer[i] = m_filter.process(-0.5F);
		else
			buffer[i] = m_filter.process(0.5F);
	}

	return DSTAR_RADIO_BIT_LENGTH;
}

void CDStarGMSKModulator::setInvert(bool set)
{
	m_invert = set;
}
